#include <stdio.h>

// 位段 - 二进制位
// 1、位段的成员可以是int、unsigned int、signed int、或者是char（属于整形家族）类型
// 2、位段的空间上是按照需要以4个字节（int）或者1个字节（char）的方式来开辟的
// 3、位段涉及很多不确定因素，位段是不跨平台的，注重可移植性的程序应该避免使用位段。

// 达到节省空间的目标
struct A {
    int a:2;// 2意味着a需要2个bit位,2个二进制位
    int b:5;// 占5个bit位
    int c:10;
    int d:30;// 这个数字不能大于32。 报错：位域的大小无效
};
// 总共47个bit，-6个字节就够存储了，即48个bit。
// 分配空间时，此处 按照int去分配，一次分配4个字节。不够时再分配4个字节。 多分配的空间浪费掉。
// 如果定义的事char，此处按照char去分配，一次分配1个字节。

struct B {
    char a:3;
    char b:4;
    char c:5;
    char d:4;
};
int main()
{
    struct A a;
    printf("%d \n",sizeof(a)); // 输出8，占8个字节

    struct B b = {0};
    
    return 0;
}